/**
 * Copyright 2010-2011 initialize4j.org
 * 
 * <pre>
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 * </pre>
 * 
 * <pre>
 * http://www.apache.org/licenses/LICENSE-2.0
 * </pre>
 * 
 * <pre>
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 * </pre>
 */
package org.initialize4j.service;

import java.lang.reflect.Field;

import org.apache.commons.beanutils.BeanUtils;

/**
 * Utility class for wrapping some Apache Bean Utils functionality.
 * 
 * 
 * @author <a href="hillger.t@gmail.com">hillger.t</a>
 */
public final class InitializationUtil {

	/**
	 * Private constructor to prevent instances of this class.
	 */
	private InitializationUtil() {}

	/**
	 * Instantiates an object with the given class.
	 * 
	 * @param <T>
	 * @param clazz
	 * @return
	 * @throws InitializeException
	 */
	public static <T> T instance(Class<T> clazz) throws RuntimeException {
		try {
			return clazz.newInstance();
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}

	/**
	 * Returns a field value for the given source object and provided
	 * {@link Field} instance.
	 * 
	 * @param src The object to to use.
	 * @param fieldName The field name to get.
	 * @return The value which can be retrieved.
	 * @throws InitializeException
	 */
	public static Object getFieldValue(Object src, String fieldName) throws RuntimeException {
		try {
			return BeanUtils.getProperty(src, fieldName);
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}

	/**
	 * Sets a field value for the given source object and provided {@link Field}
	 * instance.
	 * 
	 * @param src The object to to use.
	 * @param fieldName The field name to set.
	 * @param value The value to set for field.
	 * @throws InitializeException If an error occurs.
	 */
	public static void setFieldValue(Object src, String fieldName, Object value) throws InitializeException {
		try {
			BeanUtils.setProperty(src, fieldName, value);
		} catch (Exception e) {
			throw new InitializeException(e);
		}
	}
}
